www.gusucode.com > VC++ SkinCtrls窗体常用控件换肤程序-源码程序 > VC++ SkinCtrls窗体常用控件换肤程序-源码程序/code/SkinCtrlTest/SkinCtrlTestDlg.cpp

    // SkinCtrlTestDlg.cpp : implementation file
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "SkinCtrlTest.h"
#include "SkinCtrlTestDlg.h"
#include "proppage.h"

#include "..\skinwindows\skinctrls.h"
#include "..\skinwindows\skinctrlmgr.h"
#include "..\skinwindows\skinbase.h"
#include "..\shared\roundcorner.h"
#include "..\shared\syscolors.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// skin bitmaps
UINT SCROLLALL[IM_LAST] = { IDB_SCROLL_HOT, IDB_SCROLL_COLD, IDB_SCROLL_COLD, IDB_SCROLL_DIS };
UINT BTNLEFT[IM_LAST] = { IDB_BTNLEFT_HOT, IDB_BTNLEFT_COLD, IDB_BTNLEFT_COLD, IDB_BTNLEFT_DIS };
UINT BTNMID[IM_LAST] = { IDB_BTNMID_HOT, IDB_BTNMID_COLD, IDB_BTNMID_COLD, IDB_BTNMID_DIS };
UINT BTNRIGHT[IM_LAST] = { IDB_BTNRIGHT_HOT, IDB_BTNRIGHT_COLD, IDB_BTNRIGHT_COLD, IDB_BTNRIGHT_DIS };
UINT BTNCLIPLEFT[IM_LAST] = { IDB_BTNCLIPLEFT_HOT, IDB_BTNCLIPLEFT_COLD, IDB_BTNCLIPLEFT_COLD, IDB_BTNCLIPLEFT_DIS };
UINT BTNCLIPRIGHT[IM_LAST] = { IDB_BTNCLIPRIGHT_HOT, IDB_BTNCLIPRIGHT_COLD, IDB_BTNCLIPRIGHT_COLD, IDB_BTNCLIPRIGHT_DIS };
UINT SPINUP[IM_LAST] = { IDB_SPINUP_HOT, IDB_SPINUP_COLD, IDB_SPINUP_COLD, IDB_SPINUP_DIS };
UINT SPINDOWN[IM_LAST] = { IDB_SPINDOWN_HOT, IDB_SPINDOWN_COLD, IDB_SPINDOWN_COLD, IDB_SPINDOWN_DIS };
UINT SPINRIGHT[IM_LAST] = { IDB_SPINRIGHT_HOT, IDB_SPINRIGHT_COLD, IDB_SPINRIGHT_COLD, IDB_SPINRIGHT_DIS };
UINT SPINLEFT[IM_LAST] = { IDB_SPINLEFT_HOT, IDB_SPINLEFT_COLD, IDB_SPINLEFT_COLD, IDB_SPINLEFT_DIS };
UINT PROGLEFT[IM_LAST] = { IDB_BTNLEFT_COLD, 0, 0, IDB_BTNLEFT_DIS };
UINT PROGMID[IM_LAST] = { IDB_BTNMID_COLD, 0, 0, IDB_BTNMID_DIS };
UINT PROGRIGHT[IM_LAST] = { IDB_BTNRIGHT_COLD, 0, 0, IDB_BTNRIGHT_DIS };

enum { UNSKINNED, DEFAULTSKIN, BITMAPSKIN, CUSTOMSKIN };

/////////////////////////////////////////////////////////////////////////////
// CSkinCtrlTestDlg dialog

CSkinCtrlTestDlg::CSkinCtrlTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSkinCtrlTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSkinCtrlTestDlg)
	m_nSkinOption = BITMAPSKIN;
	m_sEdit2 = _T("the quick brown fox\r\njumps over the lazy dog.\r\nthe quick brown fox\r\njumps over the lazy dog.\r\nthe quick brown fox\r\njumps over the lazy dog.\r\nthe quick brown fox\r\njumps over the lazy dog.\r\n");
	m_sRichedit = m_sEdit2;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_crBkgnd = GetSysColor(COLOR_3DFACE);
}

void CSkinCtrlTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSkinCtrlTestDlg)
	DDX_Control(pDX, IDC_BUTTON3, m_btn3);
	DDX_Control(pDX, IDC_BUTTON4, m_btn4);
	DDX_Control(pDX, IDC_PROGRESS2, m_progressV);
	DDX_Control(pDX, IDC_COMBO2, m_combo);
	DDX_Control(pDX, IDC_PROGRESS1, m_progressH);
	DDX_Control(pDX, IDC_SCROLLBAR1, m_scrollbar);
	DDX_Control(pDX, IDC_LIST2, m_listbox);
	DDX_Control(pDX, IDC_TAB1, m_tab);
	DDX_Control(pDX, IDC_TREE1, m_tree);
	DDX_Control(pDX, IDC_LIST1, m_listctrl);
	DDX_Radio(pDX, IDC_UNSKINNED, m_nSkinOption);
	DDX_Text(pDX, IDC_EDIT2, m_sEdit2);
	DDX_Text(pDX, IDC_RICHEDIT1, m_sRichedit);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSkinCtrlTestDlg, CDialog)
	//{{AFX_MSG_MAP(CSkinCtrlTestDlg)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	ON_BN_CLICKED(IDC_DEFAULTSKIN, OnChangeSkin)
	ON_WM_DRAWITEM()
	ON_WM_MEASUREITEM()
	ON_WM_COMPAREITEM()
	ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
	ON_BN_CLICKED(IDC_SETCOLOR, OnSetcolor)
	ON_BN_CLICKED(IDC_BITMAPSKIN, OnChangeSkin)
	ON_BN_CLICKED(IDC_CUSTOMSKIN, OnChangeSkin)
	ON_BN_CLICKED(IDC_UNSKINNED, OnChangeSkin)
	ON_BN_CLICKED(IDC_PROPSHEET, OnPropsheet)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSkinCtrlTestDlg message handlers

BOOL CSkinCtrlTestDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// list ctrl
	m_listctrl.InsertColumn(0, "column1", LVCFMT_LEFT, 100);
	m_listctrl.InsertColumn(1, "column2", LVCFMT_LEFT, 100);
	m_listctrl.InsertColumn(2, "column3", LVCFMT_LEFT, 100);

	for (int nItem = 0; nItem < 30; nItem++)
	{
		CString sItem;
		sItem.Format("Item %d, 1", nItem + 1);
		int nIndex = m_listctrl.InsertItem(nItem, sItem);

		for (int nSubItem = 1; nSubItem < 3; nSubItem++)
		{
			sItem.Format("Item %d, %d", nItem + 1, nSubItem + 1);
			m_listctrl.SetItemText(nIndex, nSubItem, sItem);
		}
	}

	// tree ctrl
	for (nItem = 0; nItem < 10; nItem++)
	{
		CString sItem;
		sItem.Format("Item %d", nItem + 1);
		HTREEITEM hti = m_tree.InsertItem(sItem);

		sItem.Format("Item %d, 1", nItem + 1);
		HTREEITEM htiSub = m_tree.InsertItem(sItem, hti);

		sItem.Format("Item %d, 1, 1", nItem + 1);
		m_tree.InsertItem(sItem, htiSub);

		m_tree.Expand(hti, TVE_EXPAND);
		m_tree.Expand(htiSub, TVE_EXPAND);
	}

	// list/comboboxes
	for (nItem = 0; nItem < 10; nItem++)
	{
		CString sItem;
		sItem.Format("Item %d", nItem + 1);
		m_listbox.AddString(sItem);
		m_combo.AddString(sItem);
	}

	// progressctrl
	m_progressH.SetRange(0, 100);
	m_progressH.SetPos(40);
	m_progressV.SetRange(0, 100);
	m_progressV.SetPos(40);

	// tabctrl
	m_tab.InsertItem(0, "tab1");
	m_tab.InsertItem(1, "tab2");
	m_tab.InsertItem(2, "tab3");

	// scrollbar
	m_scrollbar.SetScrollRange(0, 100);
	m_scrollbar.SetScrollPos(50);

	// radio/checkbtns
	((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(1);
	((CButton*)GetDlgItem(IDC_CHECK1))->SetCheck(1);
	((CButton*)GetDlgItem(IDC_CHECK2))->SetCheck(1);
	((CButton*)GetDlgItem(IDC_CHECK3))->SetCheck(1);

	// pushbuttons
	CSkinCtrlMgr::ModifyStyle(this, IDC_BUTTON1, 0, SKBS_CLIPRIGHT);
	CSkinCtrlMgr::ModifyStyle(this, IDC_BUTTON2, 0, SKBS_CLIPBOTH);
	CSkinCtrlMgr::ModifyStyle(this, IDC_BUTTON3, 0, SKBS_CLIPLEFT);

	m_btn4.SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
	m_btn3.SetBitmap(::LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_BITMAP)));

	OnChangeSkin();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CSkinCtrlTestDlg::OnBrowse() 
{
	CFileDialog dlg(TRUE);

	dlg.DoModal();
}

void CSkinCtrlTestDlg::OnChangeSkin() 
{
	UpdateData();

	CSkinCtrlMgr::Reset();
	CSkinCtrlMgr::SetColor(COLOR_PARENTBKGND, m_crBkgnd);

	switch (m_nSkinOption)
	{
	case UNSKINNED:
		CSkinCtrlMgr::EnableSkinDraw(FALSE);
		CSkinCtrlMgr::SetRenderer(NULL);
		break;

	case DEFAULTSKIN:
		CSkinCtrlMgr::SetRenderer(NULL);
		CSkinCtrlMgr::EnableSkinDraw(TRUE);
		break;
		
	case BITMAPSKIN:
		CSkinCtrlMgr::EnableSkinDraw(TRUE);
		CSkinCtrlMgr::SetRenderer(NULL);

		// load bitmap resources into skin
		CSkinCtrlMgr::SetControlBitmap(SKCB_SCROLLALL, SCROLLALL, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_BUTTONLEFT, BTNLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_BUTTONMIDDLE, BTNMID, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_BUTTONRIGHT, BTNRIGHT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_HEADERLEFT, BTNLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_HEADERMIDDLE, BTNMID, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_HEADERRIGHT, BTNRIGHT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSLEFT, BTNLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSMIDDLE, BTNMID, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSRIGHT, BTNRIGHT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SLIDERTHUMBHORZ, SCROLLALL, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SLIDERTHUMBVERT, SCROLLALL, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_BUTTONCLIPLEFT, BTNCLIPLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_BUTTONCLIPRIGHT, BTNCLIPRIGHT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SPINUP, SPINUP, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SPINDOWN, SPINDOWN, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SPINRIGHT, SPINRIGHT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_SPINLEFT, SPINLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSLEFT, PROGLEFT, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSMIDDLE, PROGMID, 255);
		CSkinCtrlMgr::SetControlBitmap(SKCB_PROGRESSRIGHT, PROGRIGHT, 255);

		CSkinCtrlMgr::RedrawAll();
		break;
		
	case CUSTOMSKIN:
		CSkinCtrlMgr::SetRenderer(this);
		CSkinCtrlMgr::EnableSkinDraw(TRUE);
		break;
	}

	CSkinCtrlMgr::RedrawAll();
}

BOOL CSkinCtrlTestDlg::Draw3dEdge(CDC* pDC, LPRECT pRect, int nEdge, int nState, int nClipping)
{ 
	COLORREF crTopLeft, crBottomRight;
	BOOL bHot = (nState == IM_HOT);

	switch (nEdge)
	{
	case SKCS_CLIENTEDGE:
		crTopLeft = ::GetSysColor(bHot ? COLOR_3DDKSHADOW : COLOR_3DSHADOW);
		crBottomRight = ::GetSysColor(bHot ? COLOR_3DHIGHLIGHT : COLOR_3DSHADOW);
		break;

	case SKCS_BTNEDGE:
		crTopLeft = ::GetSysColor(bHot ? COLOR_3DHIGHLIGHT : COLOR_3DSHADOW);
		crBottomRight = ::GetSysColor(bHot ? COLOR_3DDKSHADOW : COLOR_3DSHADOW);
		break;

	case SKCS_ETCHEDEDGE:
		crTopLeft = ::GetSysColor(COLOR_3DSHADOW);
		crBottomRight = ::GetSysColor(COLOR_3DSHADOW);
		break;

	case SKCS_NOEDGE:
	default:
		return FALSE;
	}

	pDC->Draw3dRect(pRect, crTopLeft, crBottomRight);
	return TRUE;
}

BOOL CSkinCtrlTestDlg::Draw3dRoundEdge(CDC* pDC, LPRECT pRect, int nEdge, int nState)
{ 
	BOOL bHot = (nState == IM_HOT);
	DWORD dwStyle = RC_THIN;
	COLORREF crBkgnd = -1;

	switch (nEdge)
	{
	case SKCS_CLIENTEDGE:
		dwStyle |= bHot ? RC_DOWN : 0;
		crBkgnd = bHot ? -1 : ::GetSysColor(COLOR_3DSHADOW);
		break;

	case SKCS_BTNEDGE:
		dwStyle |= bHot ? RC_UP : 0;
		crBkgnd = bHot ? -1 : ::GetSysColor(COLOR_3DSHADOW);
		break;

	case SKCS_ETCHEDEDGE:
		crBkgnd = ::GetSysColor(COLOR_3DSHADOW);
		break;

	case SKCS_NOEDGE:
	default:
		return FALSE;
	}

	CRoundCorner::Draw(pDC, pRect, (pRect->right - pRect->left) / 2, RC_ALL, dwStyle, crBkgnd);
	return TRUE;
}

BOOL CSkinCtrlTestDlg::Draw3dRect(CDC* pDC, LPRECT pRect, int nEdge, int nState, COLORREF crBkgnd, int nClipping)
{ 
	pDC->FillSolidRect(pRect, crBkgnd);
	Draw3dEdge(pDC, pRect, nEdge, nState, nClipping);

	return TRUE;
}

/*
BOOL CSkinCtrlTestDlg::DrawScrollbarButton(CDC* pDC, LPRECT pRect, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawScrollbarButtonArrow(CDC* pDC, LPRECT pRect, int nBar, BOOL bBack, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawSpinButton(CDC* pDC, LPRECT pRect, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawSpinButtonArrow(CDC* pDC, LPRECT pRect, int nBar, BOOL bBack, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawPushButton(CDC* pDC, LPRECT pRect, int nState, BOOL bClipLeft, BOOL bClipRight) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawPushButtonText(CDC* pDC, LPRECT pRect, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawRadioButton(CDC* pDC, LPRECT pRect, int nCheckState, int nState) 
{ 
	return FALSE; 
}

BOOL CSkinCtrlTestDlg::DrawCheckButton(CDC* pDC, LPRECT pRect, int nCheckState, int nState) 
{ 
	return FALSE; 
}
*/

void CSkinCtrlTestDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	if (nIDCtl == IDC_BUTTON1)
	{
		// fill background
		::SetBkColor(lpDrawItemStruct->hDC, GetSysColor(COLOR_3DFACE));
		::ExtTextOut(lpDrawItemStruct->hDC, 0, 0, ETO_OPAQUE, &lpDrawItemStruct->rcItem, NULL, 0, NULL);

		// draw a small black square
		CRect rect(lpDrawItemStruct->rcItem);
		rect.DeflateRect(13, 6);

		if (lpDrawItemStruct->itemState & (ODS_CHECKED | ODS_SELECTED))
			rect.OffsetRect(1, 1);

		::SetBkColor(lpDrawItemStruct->hDC, 0);
		::ExtTextOut(lpDrawItemStruct->hDC, rect.left, rect.top, ETO_OPAQUE, rect, NULL, 0, NULL);
	}
}

void CSkinCtrlTestDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	// TODO: Add your message handler code here and/or call default
	
	//CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}

int CSkinCtrlTestDlg::OnCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct) 
{
	// TODO: Add your message handler code here and/or call default
	
	return 0;//CDialog::OnCompareItem(nIDCtl, lpCompareItemStruct);
}

void CSkinCtrlTestDlg::OnCheck3() 
{
	GetDlgItem(IDC_BUTTON4)->EnableWindow(((CButton*)GetDlgItem(IDC_CHECK3))->GetCheck());
	
}

void CSkinCtrlTestDlg::OnSetcolor() 
{
	CColorDialog dialog;
	
	dialog.m_cc.Flags |= CC_FULLOPEN | CC_RGBINIT;
	dialog.m_cc.rgbResult = m_crBkgnd;

	if (dialog.DoModal() == IDOK)
	{
		m_crBkgnd = dialog.GetColor();

		CSkinCtrlMgr::SetColor(COLOR_PARENTBKGND, m_crBkgnd);
		CSkinCtrlMgr::RedrawAll();
	}
}

void CSkinCtrlTestDlg::OnPropsheet() 
{
	CPropertySheet sheet;
	CPropPage page;

	sheet.AddPage(&page);
	sheet.DoModal();
}